package com.leetcode.August;

/**
 * @Description: '189. 轮转数组
 * 计算实际需要旋转的位置：由于数组长度为 n，若 k 大于 n，那么实际上只需要旋转 k % n 次即可达到相同的效果。因此，我们首先计算 k = k % n。
 * 整体反转数组：先对整个数组进行一次反转。例如，原数组是 [1, 2, 3, 4, 5]，反转后变成 [5, 4, 3, 2, 1]。
 * 局部反转前 k 个元素：接着反转前 k 个元素。如果 k = 2，那么反转后的数组变为 [4, 5, 3, 2, 1]。
 * 局部反转剩余的元素：最后，反转剩余的 n - k 个元素。这样最终数组变为 [4, 5, 1, 2, 3]。
 * 示例
 * 假设数组 nums 为 [1, 2, 3, 4, 5]，k 为 2。
 *
 * 计算实际旋转次数：k = k % n = 2 % 5 = 2。
 * 整体反转：[1, 2, 3, 4, 5] 变为 [5, 4, 3, 2, 1]。
 * 局部反转前 k 个元素：[5, 4, 3, 2, 1] 变为 [4, 5, 3, 2, 1]。
 * @Author: Mr.Fxy
 * @CreateTime: 2024-08-17 21:03
 */
public class LC189轮转数组 {
    public void rotate(int[] nums, int k) {
        int n = nums.length;
        k = k % n;
        reverse(nums, 0, n - 1);
        reverse(nums, 0, k - 1);
        reverse(nums, k, n - 1);
    }
    private static void reverse(int[] nums, int start, int end) {
        while (start < end) {
            int temp = nums[start];
            nums[start] = nums[end];
            nums[end] = temp;
            start++;
            end--;
        }
    }
}

